#ifndef _BLE_CORE_H_
#define _BLE_CORE_H_

#include <stdint.h>
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"
#include "esp_bt_defs.h"

#ifdef __cplusplus
extern "C"
{
#endif

// 日志标签（与c文件一致）
#define BLE_CORE_TAG "BLE_CORE"

// -------------------------- 宏定义（需在头文件中共享） --------------------------
#define PROFILE_NUM 2      // 两个Profile（A和B）
#define PROFILE_A_APP_ID 0 // Profile A ID
#define PROFILE_B_APP_ID 1 // Profile B ID

    // -------------------------- Profile结构体定义（需在头文件中共享） --------------------------
    struct gatts_profile_inst
    {
        esp_gatts_cb_t gatts_cb;
        uint16_t gatts_if;
        uint16_t app_id;
        uint16_t conn_id;
        uint16_t service_handle; // 服务句柄（服务创建时获取）
        esp_gatt_srvc_id_t service_id;
        uint16_t char_handle; // 特征句柄（特征添加时获取）
        esp_bt_uuid_t char_uuid;
        esp_gatt_perm_t perm;
        esp_gatt_char_prop_t property; // 特征属性（读/写/通知）
        uint16_t descr_handle;         // CCCD描述符句柄（特征添加时获取）
        esp_bt_uuid_t descr_uuid;
        esp_bd_addr_t remote_bda; // 保存远程设备蓝牙地址
    };

    // -------------------------- 声明外部变量（供其他文件访问） --------------------------
    // 注意：去掉ble_core.c中gl_profile_tab的static修饰，否则无法外部访问
    extern struct gatts_profile_inst gl_profile_tab[PROFILE_NUM];
// -------------------------- 配网相关定义 --------------------------
#define WIFI_PROV_CHAR_UUID GATTS_CHAR_UUID_TEST_A // 使用Profile A的特征作为配网通道
#define MAX_SSID_LEN 32                            // SSID最大长度
#define MAX_PASS_LEN 64                            // 密码最大长度
#define PROV_DATA_DELIMITER '|'                    // 分隔符（SSID|password）
#define STORED_PROV_NAMESPACE "wifi_prov"          // NVS命名空间
#define STORED_PROV_SSID_KEY "ssid"                // NVS中SSID键
#define STORED_PROV_PASS_KEY "password"            // NVS中密码键
    // 配网状态
    typedef enum
    {
        BLE_PROV_STATE_IDLE,     // 未配网
        BLE_PROV_STATE_RECEIVED, // 已接收凭据
        BLE_PROV_STATE_SAVED,    // 已保存到NVS
        BLE_PROV_STATE_FAILED    // 配网失败
    } ble_prov_state_t;

    static ble_prov_state_t s_prov_state = BLE_PROV_STATE_IDLE; // 全局配网状态

    // -------------------------- 配网相关定义 --------------------------

    // -------------------------- BLE核心服务相关定义 ----------
    // BLE事件类型（包含通知使能/禁用事件）
    typedef enum
    {
        BLE_CORE_EVT_CONNECT,        // 设备连接
        BLE_CORE_EVT_DISCONNECT,     // 设备断开
        BLE_CORE_EVT_READ,           // 特征读请求
        BLE_CORE_EVT_WRITE,          // 特征写请求
        BLE_CORE_EVT_NOTIFY_ENABLE,  // 通知使能（客户端开启通知）
        BLE_CORE_EVT_NOTIFY_DISABLE, // 通知禁用（客户端关闭通知）

        BLE_CORE_EVT_PROV_RECEIVED, // 收到WiFi凭据
        BLE_CORE_EVT_PROV_SAVED,    // 凭据已保存到NVS
        BLE_CORE_EVT_PROV_FAILED    // 配网失败
    } ble_core_evt_type_t;

    // 配网事件参数
    typedef struct
    {
        char ssid[MAX_SSID_LEN];
        char password[MAX_PASS_LEN];
    } ble_core_prov_params_t;

    // BLE事件结构体（与头文件原定义一致）
    typedef struct
    {
        ble_core_evt_type_t type; // 事件类型
        union
        {
            // 连接/断开事件参数
            struct
            {
                uint16_t conn_id;  // 连接ID
                esp_bd_addr_t bda; // 远程设备蓝牙地址
            } conn;
            // 读/写事件参数
            struct
            {
                uint16_t handle; // 特征句柄
                uint16_t len;    // 数据长度
                uint8_t *data;   // 数据指针（写事件需注意内存释放）
            } data;
            ble_core_prov_params_t prov; // 配网参数
        } params;
    } ble_core_evt_t;

    // 事件回调函数类型（用户通过此回调接收BLE事件）
    typedef void (*ble_core_evt_handler_t)(ble_core_evt_t *evt);

    /**
     * @brief 初始化BLE核心服务
     *
     * @param evt_handler 事件回调函数（用户实现，接收BLE所有事件）
     * @return esp_err_t ESP_OK：初始化成功；其他值：初始化失败
     */
    esp_err_t ble_core_init(ble_core_evt_handler_t evt_handler);

    /**
     * @brief 启动BLE广告（设备可被扫描/连接）
     *
     * @param device_name 广播的设备名称（如"ESP32C2_BLE"）
     * @return esp_err_t ESP_OK：广告启动成功；其他值：启动失败
     */
    esp_err_t ble_core_advertise_start(const char *device_name);

    /**
     * @brief 停止BLE广告
     *
     * @return esp_err_t ESP_OK：广告停止成功；其他值：停止失败
     */
    esp_err_t ble_core_advertise_stop();

    /**
     * @brief 发送BLE通知（需客户端已开启通知）
     *
     * @param conn_id 连接ID（从BLE_CORE_EVT_CONNECT事件获取）
     * @param handle 特征句柄（从服务创建时记录的全局变量获取）
     * @param data 通知数据指针（非NULL）
     * @param len 通知数据长度（≤MTU-3，默认MTU=23，故最大20字节）
     * @return esp_err_t ESP_OK：通知发送成功；其他值：发送失败
     */
    esp_err_t ble_core_notify(uint16_t conn_id, uint16_t handle, uint8_t *data, uint16_t len);

    /**
     * @brief 获取NVS中保存的配网参数
     * 如果存在已保存的WiFi配置，则读取SSID和密码 并通知上层应用回调函数
     * @return void
     */
    void get_nvs_prov_params(ble_core_evt_handler_t evt_handler);

    void clear_wifi_nvs_info();
    /**
     * @brief 关闭BLE功能，停用协议栈并释放相关内存
     * 功能包括：停止广播、断开连接、禁用GATT/Bluedroid、关闭蓝牙控制器、释放动态内存
     * @return esp_err_t ESP_OK：成功；其他值：失败
     */
    esp_err_t ble_core_deinit(void);

#ifdef __cplusplus
}
#endif

#endif /* _BLE_CORE_H_ */